package com.yzqp.serverorder.config;


import feign.Request;
import feign.RequestInterceptor;
import feign.Retryer;
import feign.codec.ErrorDecoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;

import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Map;

/**
 /**
 * @author axin
 * @summary fegin 客户端的自定义配置
 */
@Slf4j
public class MyConfiguration {
    /**
     * 自定义重试机制
     * @return
     */
    @Bean
    public Retryer feignRetryer() {
        //最大请求次数为5，初始间隔时间为100ms，下次间隔时间1.5倍递增，重试间最大间隔时间为1s，
        return new Retryer.Default();
    }

    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() == 400) {
                log.error("请求xxx服务400参数错误,返回:{}", response.body());
            }

            if (response.status() == 409) {
                log.error("请求xxx服务409异常,返回:{}", response.body());
            }

            if (response.status() == 404) {
                log.error("请求xxx服务404异常,返回:{}", response.body());
            }



            // 其他异常交给Default去解码处理
            // 这里使用单例即可，Default不用每次都去new
            return new ErrorDecoder.Default().decode(key, response);
        };
    }

    /**
     * fegin 拦截器
     * @return
     */
//    @Bean
//    public RequestInterceptor cameraSign() {
//        return template -> {
//            // 如果是get请求
//            if (template.method().equals("GET")||template.method().equals("get")) {
//                //获取到get请求的参数
//                Map<String, Collection<String>> queries = template.queries();
//            }
//
//            //如果是Post请求
//            if (template.method().equals("POST")||template.method().equals("post")) {
//                //获得请求body
//                String body = template.requestBody().asString();
//                JSONPObject request = JSON.parseObject(body, JSONPObject.class);
//            }
//            //Do what you want... 例如生成接口签名
//            String sign = "根据请求参数生成的签名";
//            //放入url？之后
//            template.query("sign", sign);
//            //放入请求body中
//            String newBody = "原有body" + sign;
//            template.body(Request.Body.encoded(newBody.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8));
//        };
//
//    }

}